/*
 * @Descripttion: 常用校验相关
 * @version:
 * @Author: lhl
 * @Date: 2024-09-09 10:31:36
 * @LastEditors: lhl
 * @LastEditTime: 2024-09-09 11:28:33
 */

/**
 * 判断是否是微信环境
 * @returns 如果是微信环境返回 true，否则返回 false
 */
export const isValidWeChat = (): boolean => {
  return /MicroMessenger/i.test(window.navigator.userAgent);
};

/**
 * 判断设备类型
 * @returns 'android' | 'ios' | 'other'
 */
export const isValidDeviceType = (): 'android' | 'ios' | 'other' => {
  const userAgent = navigator.userAgent.toLowerCase();

  if (/android/.test(userAgent)) {
    return 'android';
  } else if (/iphone|ipad|ipod/.test(userAgent)) {
    return 'ios';
  } else {
    return 'other';
  }
};

/**
 * 验证手机号是否符合中国的手机号格式
 * @param phoneNumber 输入的手机号
 * @returns 如果手机号格式正确返回 true，否则返回 false
 */
export const isValidPhone = (phoneNumber: string): boolean => {
  // 根据工信部2019年最新公布的手机号段
  const phoneRegex =
    /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/;
  return phoneRegex.test(phoneNumber);
};

/**
 * 验证身份证号码是否符合中国的身份证号码格式
 * @param idCard 输入的身份证号码
 * @returns 如果身份证号码格式正确返回 true，否则返回 false
 */
export const isValidIdCard = (idCard: string): boolean => {
  // 身份证号码必须是18位
  if (idCard.length !== 18) {
    return false;
  }

  // 前17位必须是数字
  for (let i = 0; i < 17; i++) {
    if (!/[0-9]/.test(idCard[i])) {
      return false;
    }
  }

  // 第18位可以是数字或字母X
  if (!/[0-9X]/.test(idCard[17])) {
    return false;
  }

  // 校验码验证
  const weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  const checkCode = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
  let sum = 0;

  for (let i = 0; i < 17; i++) {
    sum += parseInt(idCard[i]) * weight[i];
  }

  const mod = sum % 11;
  return idCard[17] === checkCode[mod];
};

/**
 * 检查地址中是否包含数字或门牌号
 * @param address 输入的地址
 * @returns 如果地址中包含数字或门牌号返回 true，否则返回 false
 */
export const isValidAddress = (address: string): boolean => {
  // 匹配常见的门牌号格式，如 "123号"、"123-4"、"123A" 等
  const houseNumberRegex = /\d+号|\d+-\d+|\d+[A-Za-z]/;
  // 匹配任意数字
  const numberRegex = /\d/;

  return houseNumberRegex.test(address) || numberRegex.test(address);
};

/**
 * 验证邮箱地址是否符合常见的邮箱格式
 * @param email 输入的邮箱地址
 * @returns 如果邮箱地址格式正确返回 true，否则返回 false
 */
export const isValidEmail = (email: string): boolean => {
  // 邮箱地址的正则表达式
  const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
  return emailRegex.test(email);
};

/**
 * 检查字符串是否包含特殊字符
 * @param str 输入的字符串
 * @returns 如果字符串包含特殊字符返回 true，否则返回 false
 */
export const isValidSpecialCharacters = (str: string): boolean => {
  // 匹配常见的特殊字符
  const specialCharRegex = /[!@#$%^&*()_+\-=$${};':"\\|,.<>?~`]/;
  return specialCharRegex.test(str);
};

/**
 * 校验密码是否符合要求
 * @param password 输入的密码
 * @returns 如果密码符合要求返回 true，否则返回 false 字符串中至少包含一个字母（大写或小写）& 至少包含一个数字 & 长度为 6 到 20 个字符
 */
export const isValidPassword = (password: string): boolean => {
  // 正则表达式：长度为 6 到 20 个字符，且必须包含字母和数字
  const passwordRegex = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,20}$/;
  return passwordRegex.test(password);
};
